package com.yyl.common.system.base.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yyl.common.api.Result;
import com.yyl.common.constant.Inter.SysUserConstant;
import com.yyl.common.system.query.QueryGenerator;
import com.yyl.common.util.oConvertUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.locale.LocaleConvertUtils;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
public class JeecgController<T, S extends IService<T>> {

	@Autowired
	S service;
	/**
	 * 导出 excel
	 */
	public ModelAndView exportXls(HttpServletRequest request,T object,Class<T> clazz,String title){
		// step 1.组装查询条件
		QueryWrapper<T> queryWrapper= QueryGenerator.initQueryWrapper(object,request.getParameterMap());
		
		// step 获取导出数据
		List<T> pageList=service.list(queryWrapper);
		System.out.println("导出的数据："+pageList);
		List<T> exportList = null;
		// 过滤选中数据
		String selections=request.getParameter("selections");
		if(oConvertUtils.isNotEmpty(selections)){
			List<String> selectionList= Arrays.asList(selections.split(","));
			exportList = pageList.stream().filter(item->selectionList.contains(getId(item))).collect(Collectors.toList());
		}else {
			exportList =pageList;
		}
		// step.3 AutoPoi 导出 Excel
		ModelAndView mv=new ModelAndView(new JeecgEntityExcelView());
		mv.addObject(NormalExcelConstants.FILE_NAME,title);// 此处设置的 filename 无效，前端会重新更新设置一下
		mv.addObject(NormalExcelConstants.CLASS,clazz);
		mv.addObject(NormalExcelConstants.PARAMS,new ExportParams(title+"报表","导出人："+ SysUserConstant.SYS_USER.getRealname(),title));
		mv.addObject(NormalExcelConstants.DATA_LIST,exportList);
		return mv;
	}
	
	/**
	 * 获取对象ID
	 * @param item
	 * @return
	 */
	private String getId(T item){
		try{
			return PropertyUtils.getProperty(item,"id").toString();
		}catch (Exception e){
			e.printStackTrace();
			return null;
		}
	}
	// 通过 excel 导入数据
	protected Result<?> importExcel(HttpServletRequest request, HttpServletResponse response,Class<T> clazz){
		MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest) request;
		Map<String, MultipartFile> fileMap=multipartRequest.getFileMap();
		for (Map.Entry<String,MultipartFile> entity : fileMap.entrySet()){
			MultipartFile file=entity.getValue();// 获取上传对象
			ImportParams params=new ImportParams();// 导入参数
			params.setTitleRows(2);
			params.setHeadRows(1);
			params.setNeedSave(true);
			try{
				List<T> list= ExcelImportUtil.importExcel(file.getInputStream(),clazz,params);
				//update-begin-author:taoyan date:20190528 for:批量插入数据
				long start=System.currentTimeMillis();
				service.saveBatch(list);
				//400条 saveBatch消耗时间1592毫秒  循环插入消耗时间1947毫秒
				//1200条  saveBatch消耗时间3687毫秒 循环插入消耗时间5212毫秒
				log.info("消耗时间"+(System.currentTimeMillis() -start)+"毫秒");
				//update-end-author:taoyan date:20190528 for:批量插入数据
				return Result.ok("文件导入成功!数据行数："+list.size());
			}catch (Exception e){
				log.error(e.getMessage(),e);
				return Result.error("文件导入失败："+e.getMessage());
			}finally {
				try{
					file.getInputStream().close();
				}catch (IOException e){
					e.printStackTrace();
				}
			}
		}
		return Result.error("文件导入失败：");
	}

}
